/* 
Copyright Paul James Mutton, 2001-2007, http://www.jibble.org/

This file is part of PircBot.

This software is dual-licensed, allowing you to choose between the GNU
General Public License (GPL) and the www.jibble.org Commercial License.
Since the GPL may be too restrictive for use in a proprietary application,
a commercial license is also provided. Full license information can be
found at http://www.jibble.org/licenses/

 */

package org.jibble.pircbot;

/**
 * The Colors class provides several static fields and methods that you may find
 * useful when writing an IRC Bot.
 * <p>
 * This class contains constants that are useful for formatting lines sent to
 * IRC servers. These constants allow you to apply various formatting to the
 * lines, such as colours, boldness, underlining and reverse text.
 * <p>
 * The class contains static methods to remove colours and formatting from lines
 * of IRC text.
 * <p>
 * Here are some examples of how to use the contants from within a class that
 * extends PircBot and imports org.jibble.pircbot.*;
 * 
 * <pre>
 * sendMessage("#cs", Colors.BOLD + "A bold hello!");
 *     <b>A bold hello!</b>
 * sendMessage("#cs", Colors.RED + "Red" + Colors.NORMAL + " text");
 *     <font color="red">Red</font> text
 * sendMessage("#cs", Colors.BOLD + Colors.RED + "Bold and red");
 *     <b><font color="red">Bold and red</font></b>
 * </pre>
 * 
 * Please note that some IRC channels may be configured to reject any messages
 * that use colours. Also note that older IRC clients may be unable to correctly
 * display lines that contain colours and other control characters.
 * <p>
 * Note that this class name has been spelt in the American style in order to
 * remain consistent with the rest of the Java API.
 * 
 * 
 * @since 0.9.12
 * @author Paul James Mutton, <a
 *         href="http://www.jibble.org/">http://www.jibble.org/</a>
 * @version 1.4.6 (Build time: Wed Apr 11 19:20:59 2007)
 */
public class Colors {

	/**
	 * Removes all previously applied color and formatting attributes.
	 */
	public static final String NORMAL = "\u000f";

	/**
	 * Bold text.
	 */
	public static final String BOLD = "\u0002";

	/**
	 * Underlined text.
	 */
	public static final String UNDERLINE = "\u001f";

	/**
	 * Reversed text (may be rendered as italic text in some clients).
	 */
	public static final String REVERSE = "\u0016";

	/**
	 * White coloured text.
	 */
	public static final String WHITE = "\u000300";

	/**
	 * Black coloured text.
	 */
	public static final String BLACK = "\u000301";

	/**
	 * Dark blue coloured text.
	 */
	public static final String DARK_BLUE = "\u000302";

	/**
	 * Dark green coloured text.
	 */
	public static final String DARK_GREEN = "\u000303";

	/**
	 * Red coloured text.
	 */
	public static final String RED = "\u000304";

	/**
	 * Brown coloured text.
	 */
	public static final String BROWN = "\u000305";

	/**
	 * Purple coloured text.
	 */
	public static final String PURPLE = "\u000306";

	/**
	 * Olive coloured text.
	 */
	public static final String OLIVE = "\u000307";

	/**
	 * Yellow coloured text.
	 */
	public static final String YELLOW = "\u000308";

	/**
	 * Green coloured text.
	 */
	public static final String GREEN = "\u000309";

	/**
	 * Teal coloured text.
	 */
	public static final String TEAL = "\u000310";

	/**
	 * Cyan coloured text.
	 */
	public static final String CYAN = "\u000311";

	/**
	 * Blue coloured text.
	 */
	public static final String BLUE = "\u000312";

	/**
	 * Magenta coloured text.
	 */
	public static final String MAGENTA = "\u000313";

	/**
	 * Dark gray coloured text.
	 */
	public static final String DARK_GRAY = "\u000314";

	/**
	 * Light gray coloured text.
	 */
	public static final String LIGHT_GRAY = "\u000315";

	/**
	 * Removes all colours from a line of IRC text.
	 * 
	 * @since PircBot 1.2.0
	 * 
	 * @param line
	 *            the input text.
	 * 
	 * @return the same text, but with all colours removed.
	 */
	public static String removeColors(String line) {
		int length = line.length();
		StringBuffer buffer = new StringBuffer();
		int i = 0;
		while (i < length) {
			char ch = line.charAt(i);
			if (ch == '\u0003') {
				i++;
				// Skip "x" or "xy" (foreground color).
				if (i < length) {
					ch = line.charAt(i);
					if (Character.isDigit(ch)) {
						i++;
						if (i < length) {
							ch = line.charAt(i);
							if (Character.isDigit(ch)) {
								i++;
							}
						}
						// Now skip ",x" or ",xy" (background color).
						if (i < length) {
							ch = line.charAt(i);
							if (ch == ',') {
								i++;
								if (i < length) {
									ch = line.charAt(i);
									if (Character.isDigit(ch)) {
										i++;
										if (i < length) {
											ch = line.charAt(i);
											if (Character.isDigit(ch)) {
												i++;
											}
										}
									} else {
										// Keep the comma.
										i--;
									}
								} else {
									// Keep the comma.
									i--;
								}
							}
						}
					}
				}
			} else if (ch == '\u000f') {
				i++;
			} else {
				buffer.append(ch);
				i++;
			}
		}
		return buffer.toString();
	}

	/**
	 * Remove formatting from a line of IRC text.
	 * 
	 * @since PircBot 1.2.0
	 * 
	 * @param line
	 *            the input text.
	 * 
	 * @return the same text, but without any bold, underlining, reverse, etc.
	 */
	public static String removeFormatting(String line) {
		int length = line.length();
		StringBuffer buffer = new StringBuffer();
		for (int i = 0; i < length; i++) {
			char ch = line.charAt(i);
			if (ch == '\u000f' || ch == '\u0002' || ch == '\u001f'
					|| ch == '\u0016') {
				// Don't add this character.
			} else {
				buffer.append(ch);
			}
		}
		return buffer.toString();
	}

	/**
	 * Removes all formatting and colours from a line of IRC text.
	 * 
	 * @since PircBot 1.2.0
	 * 
	 * @param line
	 *            the input text.
	 * 
	 * @return the same text, but without formatting and colour characters.
	 * 
	 */
	public static String removeFormattingAndColors(String line) {
		return removeFormatting(removeColors(line));
	}

	/**
	 * This class should not be constructed.
	 */
	private Colors() {

	}

}
